const path = require('path');
const Koa = require('koa');
const convert = require('koa-convert'); // 兼容koa
const koaStatic = require('koa-static'); // ?
const koaBody = require('koa-body'); //处理post请求参数
const koaLogger = require('koa-logger');
const json = require('koa-json');
const session = require('koa-session-minimal');
const MysqlStore = require('koa-mysql-session');
const staticCache = require('koa-static-cache');
const cors = require('koa2-cors');

const config = require('./config/config');
const routers = require('./routers/index');

/**
 * 中间件
 */
const logPrint = require('./middlewares/log_print'); //日志输出
const authToken = require('./middlewares/auth_token');
const result = require('./middlewares/result');

const app = new Koa();

// 配置控制台日志中间件
app.use(convert(koaLogger()));
app.use(convert(json()));
// 配置ctx.body解析中间件
app.use(
  koaBody({
    multipart: true,
    formidable: {
      maxFileSize: 200 * 1024 * 1024, // 设置上传文件大小最大限制，默认2M
    },
  })
);

// session存储配置
const sessionMysqlConfig = {
  user: config.database.USERNAME,
  password: config.database.PASSWORD,
  database: config.database.DATABASE,
  host: config.database.HOST,
};

// 存放sessionId的cookie配置，根据情况自己设定
const cookie = {
  maxAge: 7 * 24 * 60 * 60 * 1000, // cookie有效时长(ms) 7 * 24小时
  expires: '', // cookie失效时间
  path: '/', // 写cookie所在的路径
  domain: '', // 写cookie所在的域名
  httpOnly: true, // 是否只用于http请求中获取
  overwrite: true, // 是否允许重写
  secure: false,
};

// 配置session中间件
// koa-session-minimal需要一个options对象参数：
/***
 * key：会话cookie名称
   store：会话外部存储
   cookie：cookie选项，可以是对象（静态cookie选项）或返回对象的函数（动态cookie选项）。
   只有maxAge，path，domain，secure，httpOnly是支持的。
 */
app.use(
  session({
    key: 'USER_SID', // 返回浏览器的cookie中
    store: new MysqlStore(sessionMysqlConfig),
    cookie: cookie,
  })
);

// 缓存
app.use(
  staticCache(
    path.join(__dirname, './public'),
    { dynamic: true },
    {
      maxAge: 365 * 24 * 60 * 60,
    }
  )
);

// 配置静态资源加载中间件
app.use(convert(koaStatic(path.join(__dirname, '/public'))));


// log文件输出
app.use(logPrint);

// 返回结果处理
app.use(result.restify());
// 解决跨域
app.use(
  cors({
    credentials: true,
  })
);

// session验证
app.use(authToken);

// 初始化路由中间件
app.use(routers.routes());

app.on('error', function (err) {
  console.log(err);
});

module.exports = app;
